/**
 * 剪贴板服务 - 封装剪贴板API访问
 */
class ClipboardService {
    /**
     * 检查剪贴板API是否可用
     * @returns {boolean}
     */
    static isSupported() {
        return navigator.clipboard && typeof navigator.clipboard.readText === 'function';
    }

    /**
     * 从剪贴板读取文本
     * @returns {Promise<string>} 剪贴板文本内容
     * @throws {Error} 当剪贴板不可用或权限被拒绝时
     */
    static async readText() {
        if (!this.isSupported()) {
            throw new Error('UNSUPPORTED');
        }

        try {
            const text = await navigator.clipboard.readText();
            return text;
        } catch (error) {
            if (error.name === 'NotAllowedError') {
                throw new Error('PERMISSION_DENIED');
            }
            throw error;
        }
    }
}

/**
 * Toast通知服务 - 显示操作反馈消息
 */
class ToastNotification {
    static activeToasts = [];

    /**
     * 创建并显示Toast通知
     * @param {string} message - 消息内容
     * @param {string} type - 消息类型: 'success' | 'error' | 'info'
     * @param {number} duration - 显示时长（毫秒）
     */
    static show(message, type = 'info', duration = 2000) {
        const toast = document.createElement('div');
        toast.className = `toast-notification ${type}`;
        toast.textContent = message;
        
        document.body.appendChild(toast);
        this.activeToasts.push(toast);

        // 自动移除
        setTimeout(() => {
            toast.style.animation = 'slideOut 0.3s ease';
            setTimeout(() => {
                if (toast.parentNode) {
                    toast.parentNode.removeChild(toast);
                }
                this.activeToasts = this.activeToasts.filter(t => t !== toast);
            }, 300);
        }, duration);
    }

    /**
     * 显示成功消息
     * @param {string} message - 消息内容
     * @param {number} duration - 显示时长（毫秒）
     */
    static success(message, duration = 2000) {
        this.show(message, 'success', duration);
    }

    /**
     * 显示错误消息
     * @param {string} message - 消息内容
     * @param {number} duration - 显示时长（毫秒）
     */
    static error(message, duration = 3000) {
        this.show(message, 'error', duration);
    }

    /**
     * 显示信息消息
     * @param {string} message - 消息内容
     * @param {number} duration - 显示时长（毫秒）
     */
    static info(message, duration = 2000) {
        this.show(message, 'info', duration);
    }
}

/**
 * 粘贴按钮组件 - 创建和管理粘贴按钮
 */
class PasteButton {
    /**
     * 创建标准粘贴按钮
     * @param {string} targetId - 目标输入框ID
     * @param {Object} options - 配置选项
     * @returns {HTMLButtonElement}
     */
    static createStandard(targetId, options = {}) {
        const button = document.createElement('button');
        button.className = 'btn-paste';
        button.textContent = options.icon || '📋';
        button.title = options.tooltip || '从剪贴板粘贴';
        button.setAttribute('aria-label', options.tooltip || '从剪贴板粘贴');
        
        if (options.className) {
            button.className += ' ' + options.className;
        }

        button.addEventListener('click', async () => {
            await this.paste(targetId, options.onPaste);
        });

        return button;
    }

    /**
     * 创建透明粘贴按钮（用于输入框内部）
     * @param {string} targetId - 目标输入框ID
     * @param {Object} options - 配置选项
     * @returns {HTMLButtonElement}
     */
    static createTransparent(targetId, options = {}) {
        const button = document.createElement('button');
        button.className = 'paste-btn-transparent';
        button.textContent = options.icon || '📋';
        button.title = options.tooltip || '从剪贴板粘贴';
        button.setAttribute('aria-label', options.tooltip || '从剪贴板粘贴');
        
        if (options.className) {
            button.className += ' ' + options.className;
        }

        button.addEventListener('click', async () => {
            await this.paste(targetId, options.onPaste);
        });

        return button;
    }

    /**
     * 创建内联粘贴按钮（用于输入框旁边）
     * @param {string} targetId - 目标输入框ID
     * @param {Object} options - 配置选项
     * @returns {HTMLButtonElement}
     */
    static createInline(targetId, options = {}) {
        const button = document.createElement('button');
        button.className = 'btn-paste-inline';
        button.textContent = options.icon || '📋';
        button.title = options.tooltip || '从剪贴板粘贴';
        button.setAttribute('aria-label', options.tooltip || '从剪贴板粘贴');
        
        if (options.className) {
            button.className += ' ' + options.className;
        }

        button.addEventListener('click', async () => {
            await this.paste(targetId, options.onPaste);
        });

        return button;
    }

    /**
     * 执行粘贴操作
     * @param {string} targetId - 目标输入框ID
     * @param {Function} callback - 粘贴后的回调函数
     */
    static async paste(targetId, callback = null) {
        try {
            // 检查API支持
            if (!ClipboardService.isSupported()) {
                ToastNotification.error('您的浏览器不支持剪贴板功能');
                return;
            }

            // 读取剪贴板
            const text = await ClipboardService.readText();

            // 检查内容
            if (!text || text.trim() === '') {
                ToastNotification.info('剪贴板为空');
                return;
            }

            // 填充到目标
            const target = document.getElementById(targetId);
            if (!target) {
                ToastNotification.error('目标输入框不存在');
                return;
            }

            target.value = text;
            
            // 触发input事件，确保其他监听器能响应
            target.dispatchEvent(new Event('input', { bubbles: true }));
            target.dispatchEvent(new Event('change', { bubbles: true }));

            ToastNotification.success('粘贴成功');

            // 执行回调
            if (callback && typeof callback === 'function') {
                callback(text);
            }

        } catch (error) {
            if (error.message === 'UNSUPPORTED') {
                ToastNotification.error('您的浏览器不支持剪贴板功能');
            } else if (error.message === 'PERMISSION_DENIED') {
                ToastNotification.error('请允许访问剪贴板权限');
            } else {
                ToastNotification.error('粘贴失败，请重试');
                console.error('Paste error:', error);
            }
        }
    }
}
